package com.cw.dynamicproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/*    类的作用：
    创建一个代理*/
public class ProxyUtil {

    /*方法的作用：给SuperStar对象创建一个代理
    *
    * 形参:被代理的SuperStar对象
    *
    * 返回值：给SuperStar创建的代理
    *
    * 需求：
    * 1.获取代理的对象
    * 代理对象 = ProxyUtil.createProxy(SuperStar的对象);
    *
    * 2.再调用代理的唱歌的方法
    * 代理对象.sing();
    * 最后调用invoke方法
    *
    * */
    public static Star createProxy(SuperStar superStar){
      /*  java.lang.reflect.Proxy类：提供了为对象产生代理对象的方法：

        public static Object newProxyInstance(ClassLoader loader.Class<?> interfaces,InvocationHandler h)
        参数一：用于指定用哪个类加载器，去加载生成的代理类
        参数二：指定接口，这些接口用于指定生成的接口有哪些方法
        参数三：用来指定生成的代理对象要干什么事情*/
        Star star = (Star) Proxy.newProxyInstance(
                ProxyUtil.class.getClassLoader(), // 参数一：用于指定用哪个类加载器，去加载生成的代理类
                new Class[]{Star.class}, // 参数二：指定接口，这些接口用于指定生成的接口有哪些方法(这里是一个数组)
                new InvocationHandler() { // 参数三：用来指定生成的代理对象要干什么事情
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                       /* 参数一：代理的对象
                          参数二：要运行的方法 sing
                          参数三：调用sing方法时传递的实参*/
                        if ("sing".equals(method.getName())){
                            System.out.println("准备设备，开始圈钱!!!");
                        } else if ("dance".equals(method.getName())){
                            System.out.println("准备场馆，开始圈钱!!!");
                        }
                        // 代理联系SuperStar来唱歌和跳舞
                        // 调用SuperStar内的sing/dance方法

                        return method.invoke(superStar,args);
                    }
                });
        return star;
    }
}
